TerraformでS3のオブジェクトACLを無効にする
こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です。
今回は、「TerraformでS3のオブジェクトACLを無効にする」方法をご紹介しようと思います。
3行でまとめる
local-exec
ではないよaws_s3_bucket_ownership_controls
リソースだよ- どんどん活用していこう!
S3のオブジェクトACLとは
S3のオブジェクトACLとは、S3バケットに保存された「オブジェクトに対するアクセスポリシー」です。
「re:Invent 2021」のアップデートでACLの無効化を設定可能になり、「オブジェクトACLは無効化」が推奨されることになりました。
ただし CloudFront ログ保管用バケットは、引き続きオブジェクトACL有効化が必要です。
やってみた
S3のオブジェクトACLの有効/無効の制御は、AWS Provider v3,v4関係なく「aws_s3_bucket_ownership_controls
」リソースで行います。
ドキュメントベースですが、AWS Provider v3.69.0 から値に「BucketOwnerEnforced」を設定可能でした。
data "aws_caller_identity" "self" {}
resource "aws_s3_bucket" "bucket" {
bucket = "bucket-${data.aws_caller_identity.self.account_id}"
}
resource "aws_s3_bucket_ownership_controls" "firelens" {
bucket = aws_s3_bucket.bucket.bucket
rule {
object_ownership = "BucketOwnerEnforced"
}
}
設定値は、「BucketOwnerEnforced」、「BucketOwnerPreferred」、「ObjectWriter」の三種類の中から選択します。
無効化の場合は「BucketOwnerEnforced」を選択します。違いについては、再掲にはなりますが次のブログをご覧ください。
ちなみにですが、デフォルト(aws_s3_bucket_ownership_controlsリソースを作成しない場合)の「オブジェクト所有者」設定は オブジェクトライター(ObjectWriter) でした。
vs aws_s3_bucket_acl
最後に「aws_s3_bucket_acl」との競合について調べてみました。
「オブジェクト所有者」設定を「バケット所有者の強制(BucketOwnerEnforced)」に設定する場合は、バケット所有者以外のバケット ACLが削除されている必要がありました。
aws_s3_bucket_ownership_controls.bucket: Creating...
╷
│ Error: error creating S3 Bucket (buckets-622809842341) Ownership Controls: InvalidBucketAclWithObjectOwnership: Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting
│ status code: 400, request id: XXXXXXXXXXXXXXXX, host id: XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
│
│ with aws_s3_bucket_ownership_controls.bucket,
│ on aws_s3.tf line 40, in resource "aws_s3_bucket_ownership_controls" "bucket":
│ 40: resource "aws_s3_bucket_ownership_controls" "bucket" {
マネジメントコンソールでも同様のエラーが確認できます。
最後に
以上、TerraformでS3のオブジェクトACLを無効にするでした。
オブジェクトACLの無効化できるとは今日まで知らず、是非ブログにしたいと思い書いてみました。
このブログがどなたかの参考になれば幸いです。以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!